// 封装本地存储的方法
class Storage {
  /**
   * 获取本地存储数据
   * @param {*} key:存储的名字
   * @returns
   */
  get(key) {
    const value = localStorage.getItem(key)
    // data可能需要JSON.parse来处理，可能也不需要，通过try-catch来捕获错误，如果能用JSON.parse处理就不会报错，说明是JSON字符串，报错的话去往catch，直接返回数据科即可
    try {
      return JSON.parse(value)
    } catch (error) {
      return value
    }
  }

  /**
   * 本地存储
   * @param {*} key:存储的名字
   * @param {*} value:给本地存储的值
   */
  set(key, value) {
    if (typeof value === 'object') {
      value = JSON.stringify(value)
    }
    localStorage.setItem(key, value)
  }

  /**
   * 删除本地存储
   * @param {*} key:存储的名字
   */
  remove(key) {
    localStorage.removeItem(key)
  }
}

/* 单例懒加载 */
const getStorage = (() => {
  let storage
  return () => {
    if (!storage) {
      return (storage = new Storage())
    } else {
      return storage
    }
  }
})()

// 导出方法
/* token */
const HUIKE_TOKEN = 'HUIKE_TOKEN'
export const setToken = (token) => getStorage().set(HUIKE_TOKEN, token)
export const getToken = () => getStorage().get(HUIKE_TOKEN)
export const removeToken = () => getStorage().remove(HUIKE_TOKEN)

// 可以其他需要存储在本地的数据方法，；例如：
/* cityList */
/* const HUIKE_CITYS = 'HUIKE_CITYS'
export const getCitys = () => getStorage().get(HUIKE_CITYS)
export const setCitys = (citys) => getStorage().set(HUIKE_CITYS, citys)
 */
